package com.young.design.pattern.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @ClassName : MyInvocationHandler
 * @Author : hyy
 * @Date: 2020-03-19
 */
public class DynamicProxy implements InvocationHandler {
    private Object target;

    public Object getProxy(Object target){
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

    /**
     * 参数解析
     * @param proxy  代理对象，平常并没有什么用处，但是如果在invoke()方法中将代理对象返回，则可以实现链式编程，连续调用代理对象中的方法
     * @param method 要执行的方法
     * @param args   要执行的方法的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 由于println（）方法会调用代理对象的toString方法，而在代理对象的toString方法中又是通过该对象的invok方法调用的，
        // 所以就会出现一直循环调用toString()方法的现象，从而导致栈溢出
        //System.out.println(proxy);
        System.out.println("在真是业务处理方法之前处理");
        // 调用要代理对象的指定方法
        Object invoke = method.invoke(target, args);
        System.out.println("在真实业务处理方法之后处理");
        // 返回方法真实方法执行之后的返回值
        return invoke;
    }
}
